//
//  subscriptTest.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/6/5.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef subscriptTest_hpp
#define subscriptTest_hpp

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>

struct StudentGrade {
    std::string name;
    char grade;
};

class GradeMap {
private:
    std::vector<StudentGrade> m_map;
    
    
public:
    GradeMap()
    {
    }
    
    char & operator[](const std::string &name);
};


/*
 
 Nomal:
 GradeMap grades;
 grades["Joe"] = 'A';
 grades["Frank"] = 'B';
 std::cout << "Joe has a grade of " << grades["Joe"] << '\n';
 std::cout << "Frank has a grade of " << grades["Frank"] << '\n';
 
 
 
 NOTE:不要在添加元素后，修改引用的值，因为内存块已经变了（尽量避免吧，实际测试正常o(╯□╰)o）
 GradeMap grades;
 char& gradeJoe = grades["Joe"]; // does a push_back
 gradeJoe = 'A';
 
 char& gradeFrank = grades["Frank"]; // does a push_back
 gradeFrank = 'B';
 
 std::cout << "Joe has a grade of " << gradeJoe << '\n';
 std::cout << "Frank has a grade of " << gradeFrank << '\n';
 
 当添加Frank时，std :: vector必须增长以保持它。 这需要动态分配一个新的内存块，将阵列中的元素复制到新的块中，并删除旧的块。 发生这种情况时，对std :: vector中现有元素的任何引用都将失效！ 换句话说，在我们push_back（“Frank”）之后，gradeJoe被留作删除内存的参考。 这将导致未定义的结果。
 
 
 */


#endif /* subscriptTest_hpp */
